Implement custom protoc plugin to generate OTLP JSON class definitions#4910
Implement custom protoc plugin to generate OTLP JSON class definitions#4910herin049 wants to merge 13 commits intoopen-telemetry:mainfrom
Conversation
f66380d to
a9d10c7
Compare
|
I am very much looking forward to this landing: |
codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/analyzer.py
Outdated
Show resolved
Hide resolved
|
I think it would be valuable to add a test that validates the generated JSON by feeding it to |
Just to make sure I understand your suggestion properly, currently I have an integration test which runs the plugin to generate the ProtoJSON Python classes and tests the serialization/deserialization. Are you suggesting that we also generate the corresponding Protobuf definitions and then perform the JSON serialization using the ProtoJSON classes, load the JSON using the Protobuf definitions and then compare the attributes on the ProtoJSON and Protobuf classes? |
4d4119c to
4bce86a
Compare
|
@pmcollins Since we mostly care about serialization for the SDK, I added tests to use |
|
Thanks @herin049. My suggestion is to simulate a Collector receiving JSON. In other words, end-to-end tests that create SDK objects typically sent to an exporter for emission (traces, metrics, and logs), serialize those objects into JSON using the functionality in this PR, send that JSON to our simulated Collector ( |
|
@pmcollins I will be adding the |
|
Makes sense @herin049 -- can be in a subsequent PR. |
4bce86a to
05b459f
Compare
|
@aabmass I have rewritten the commit history to separate out the addition of the |
aabmass
left a comment
There was a problem hiding this comment.
It's a bit large LGTM. I will look over the generated code too
codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/runtime/json_codec.py
Show resolved
Hide resolved
codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/plugin.py
Outdated
Show resolved
Hide resolved
codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/types.py
Outdated
Show resolved
Hide resolved
codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/writer.py
Show resolved
Hide resolved
codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/generator.py
Show resolved
Hide resolved
codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/runtime/__init__.py
Show resolved
Hide resolved
| def to_json(self) -> builtins.str: | ||
| """ | ||
| Serialize this message to a JSON string. | ||
|
|
||
| Returns: | ||
| JSON string | ||
| """ | ||
| return json.dumps(self.to_dict()) |
There was a problem hiding this comment.
Would it be reasonable to put this in a base class to try to reduce the code size a bit? Maybe there are downsides, lmk
There was a problem hiding this comment.
I've opted to add a @json_serde class decorator
opentelemetry-proto-json/src/opentelemetry/proto_json/collector/logs/v1/logs_service.py
Show resolved
Hide resolved
| typeCheckingMode = "standard" | ||
| pythonVersion = "3.9" | ||
|
|
||
| include = [ |
There was a problem hiding this comment.
Can we typecheck the plugin code here, and ideally even the generated code as a sanity check?
There was a problem hiding this comment.
Was it not possible to add opentelemetry-proto-json too?
MikeGoldsmith
left a comment
There was a problem hiding this comment.
Looks good to me outside of what @aabmass raised. Found one minor typo 👍🏻
codegen/opentelemetry-codegen-json/src/opentelemetry/codegen/json/types.py
Outdated
Show resolved
Hide resolved
5052584 to
3582fb2
Compare
| T = typing.TypeVar("T") | ||
|
|
||
|
|
||
| def json_serde(cls: type[T]) -> type[T]: |
There was a problem hiding this comment.
Do static analysis tools and pyright know about the to_json() on the resulting class?
There was a problem hiding this comment.
Yeah, I don't think it is possible to properly type this with current versions of Python. I'm just going to switch to using inheritance
| Deserialize from a JSON string or bytes. | ||
| """ | ||
| # pylint: disable-next=no-member | ||
| return cls_inner.from_dict(json.loads(data)) # type: ignore |
There was a problem hiding this comment.
You could probably fix this by using a Protocol.
| typeCheckingMode = "standard" | ||
| pythonVersion = "3.9" | ||
|
|
||
| include = [ |
There was a problem hiding this comment.
Was it not possible to add opentelemetry-proto-json too?
ab4bed2 to
c9cae12
Compare
MikeGoldsmith
left a comment
There was a problem hiding this comment.
Looks good to me. Needs the public symbols reviewing but otherwise 🚀
| ``../scripts/proto_codegen_json.sh``. Then run the script and commit the changes | ||
| as well as any fixes needed in the OTLP exporter. | ||
|
|
||
| .. _opentelemetry-codegen-json: https://github.com/open-telemetry/codegen/opentelemetry-codegen-json |
There was a problem hiding this comment.
Nit: Shouldn't this link to this repository?
Description
This PR implements a custom protoc plugin to automatically generate OTLP JSON class definitions. Consensus was reached deciding that a custom protoc plugin would be the best route for adding support for OTLP JSON while minimizing the number of runtime dependencies (for additional context reference #4886). This PR is a refined version of the first part of a set of changes that are in #4902. Please view the draft PR for an overview of how these packages will be used.
Fixes #1003
Type of change
Please delete options that are not relevant.
How Has This Been Tested?
tox run -e $(tox --listenvs | grep opentelemetry-protojson | tr '\n' ',')Does This PR Require a Contrib Repo Change?
Checklist: